package cn.shujuhai.common.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author JinJiaQi
 * @date 2024-12-25 16:06:09
 */
@Service
public class PVUVService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    private static final String PV_KEY = "pv:count";
    private static final String UV_KEY_PREFIX = "uv:count:";
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * 增加页面访问量（PV）
     */
    public void increasePV() {
        redisTemplate.opsForValue().increment(PV_KEY);
    }

    /**
     * 增加独立访客数（UV）
     *
     * @param visitorId 用户唯一标识，例如用户ID或IP地址
     */
    public void increaseUV(String visitorId) {
        String uvKey = getUVKey();
        redisTemplate.opsForSet().add(uvKey, visitorId);
    }

    /**
     * 获取当前日期的UV键
     *
     * @return UV键
     */
    private String getUVKey() {
        return UV_KEY_PREFIX + DATE_FORMAT.format(new Date());
    }

    /**
     * 获取当前的PV
     *
     * @return 当前PV
     */
    public Long getPV() {
        String pvValue = redisTemplate.opsForValue().get(PV_KEY);
        return pvValue == null ? 0L : Long.parseLong(pvValue);
    }

    /**
     * 获取当前的UV
     *
     * @return 当前UV
     */
    public Long getUV() {
        String uvKey = getUVKey();
        return redisTemplate.opsForSet().size(uvKey);
    }

    /**
     * 清除过期的UV数据
     * 可以通过定时任务每天凌晨执行一次
     */
    public void clearExpiredUVData() {
        // 获取昨天的UV键
        String yesterdayUVKey = UV_KEY_PREFIX + DATE_FORMAT.format(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000));
        redisTemplate.delete(yesterdayUVKey);
    }
}
